﻿Imports Dainfo.ControleEstoque.Model
Imports System.Data.SqlClient
<Serializable()> _
Public Class DadosVenda
    Inherits AcessoDadosBase


    Public Function GetAll() As List(Of Venda)
        Dim vendas As New List(Of Venda)
        For Each row As DataRow In ExecuteReaderReturnTable(GetCommand("Select * From Venda")).Rows
            Dim entidade As Venda = GetEntidadeByTableRow(row)
            If Not entidade Is Nothing Then
                entidade.SetGetItensDelegate(AddressOf GetItensByCodigoVenda)
                vendas.Add(entidade)
            End If
        Next
        Return vendas
    End Function

    Public Function GetById(ByVal codigo As Integer) As Venda
        Dim entidade As Venda = Nothing
        Dim cmd As SqlCommand = GetCommand("Select * From Venda Where CodVenda = @Codigo")
        AddParameterToCmd(cmd, "@Codigo", codigo)
        Dim table As DataTable = ExecuteReaderReturnTable(cmd)
        If table.Rows.Count > 0 Then
            entidade = GetEntidadeByTableRow(table.Rows(0))
            entidade.SetGetItensDelegate(AddressOf GetItensByCodigoVenda)
        End If
        Return entidade
    End Function

    Public Sub Insert(ByVal venda As Venda)
        Dim cmdInsertVenda As SqlCommand = GetCommand("Insert into Venda (Data,MeioVenda,FormaPagamento,CodCliente)Values(@Data,@MeioVenda,@FormaPagamento,@CodCliente) SELECT @@Identity")
        AddParameterToCmd(cmdInsertVenda, "@Data", venda.Data)
        AddParameterToCmd(cmdInsertVenda, "@MeioVenda", venda.MeioDeVenda.ToString())
        AddParameterToCmd(cmdInsertVenda, "@FormaPagamento", venda.FormaPagamento.ToString())
        AddParameterToCmd(cmdInsertVenda, "@CodCliente", venda.Cliente.Codigo)

        venda.Codigo = ExecuteScalar(cmdInsertVenda)

        For Each iten As ItensVenda In venda.Itens
            Dim cmdInsertIten As SqlCommand = GetCommand("Insert into ItensVenda (CodVenda, CodProduto,Quantidade)Values(@CodVenda,@CodProduto,@Quantidade)")
            AddParameterToCmd(cmdInsertIten, "@CodVenda", venda.Codigo)
            AddParameterToCmd(cmdInsertIten, "@CodProduto", iten.Produto.Codigo)
            AddParameterToCmd(cmdInsertIten, "@Quantidade", iten.Quantidade)
            ExecuteNonQuery(cmdInsertIten)
        Next

        'CommitAtomicCommands()
    End Sub

    Private Function GetItensVendaByTableRow(ByVal row As DataRow) As ItensVenda
        Dim entidade As New ItensVenda
        entidade.Codigo = GetIntFromRow(row, "CodItensVenda")
        entidade.Produto = New DadosProduto().GetById(GetIntFromRow(row, "CodProduto"))
        entidade.Quantidade = GetIntFromRow(row, "Quantidade")
        Return entidade
    End Function

    Private Function GetEntidadeByTableRow(ByVal row As DataRow) As Venda
        Dim entidade As New Venda
        entidade.Codigo = GetIntFromRow(row, "CodVenda")
        entidade.Data = Convert.ToDateTime(row("Data"))
        entidade.MeioDeVenda = DirectCast([Enum].Parse(GetType(MeioVenda), GetStringFromRow(row, "MeioVenda")), MeioVenda)
        entidade.FormaPagamento = DirectCast([Enum].Parse(GetType(FormaPagamento), GetStringFromRow(row, "FormaPagamento")), FormaPagamento)
        entidade.Cliente = New DadosCliente().GetById(GetIntFromRow(row, "CodCliente"))
        Return entidade
    End Function

    Public Function GetItensByCodigoVenda(ByVal codigoVenda As Integer) As List(Of ItensVenda)
        Dim itens As New List(Of ItensVenda)
        Dim cmd As SqlCommand = GetCommand("Select * From ItensVenda Where CodVenda = @CodVenda")
        AddParameterToCmd(cmd, "@CodVenda", codigoVenda)

        For Each row As DataRow In ExecuteReaderReturnTable(cmd).Rows
            Dim entidade As ItensVenda = GetItensVendaByTableRow(row)
            If Not entidade Is Nothing Then
                itens.Add(entidade)
            End If
        Next
        Return itens
    End Function

End Class

